'''
比如，我们在python代码中计算的一个数据需要给另外一段程序使用，那我们怎么给？
现在我们能想到的方法就是存在文件里，然后另一个python程序再从文件里读出来（用字典来存储）。
但是我们都知道，对于文件来说是没有字典这个概念的，所以我们只能将字典转换成字符串字典放到文件中。
你一定会问，将字典转换成一个字符串很简单，就是str(dic)就可以办到了，为什么我们还要学习序列化模块呢？
没错序列化的过程就是从dic 变成str(dic)的过程。现在你可以通过str(dic)，将一个名为dic的字典转换成一个字符串，
但是你要怎么把一个字符串转换成字典呢？
聪明的你肯定想到了eval()，如果我们将一个字符串类型的字典str_dic传给eval，就会得到一个返回的字典类型了。
eval()函数十分强大，但是eval是做什么的？e官方demo解释为：将字符串str当成有效的表达式来求值并返回计算结果。
ＢＵＴ！强大的函数有代价。安全性是其最大的缺点。
想象一下，如果我们从文件中读出的不是一个数据结构，而是一句"删除文件"类似的破坏性语句，那么后果实在不堪设设想。
而使用eval就要担这个风险。
所以，我们并不推荐用eval方法来进行反序列化操作(将str转换成python中的数据结构)
为什么要有序列化模块


序列化就是将我们数据结构（字典）转化为字符串
反序列化：将字符串转化为字典

序列化的目的
1、以某种存储形式使自定义对象持久化；
2、将对象从一个地方传递到另一个地方。
3、使程序更具维护性。

用于序列化的两个模块Json,pickle
json，用于字符串 和 python数据类型间进行转换
Json模块提供了四个功能：dumps、dump、loads、load
dic = {'k1':'v1','k2':'v2','k3':'v3'}
str_dic = json.dumps(dic)  #序列化：将一个字典转换成一个字符串
print(type(str_dic),str_dic)  #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"}
#注意，json转换完的字符串类型的字典中的字符串是由""表示的

dic2 = json.loads(str_dic)  #反序列化：将一个字符串格式的字典转换成一个字典
#注意，要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
print(type(dic2),dic2)  #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}]
str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型
print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
list_dic2 = json.loads(str_dic)
print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]
#文件操作
with open("json file","w")  as f:
    json.dump({"a":1,"b":2,"c":3},f)
with open("json file","r") as f:
    arg = json.load(f)
    print(arg)
dump和dumps进行序列化得时候，当字典中存在中文得时候，为了确保能正常得显示相应的中文,
需要加上相应的关键字参数：ensure_ascii=False默认为True,意思是将ascii不能表达的字符使“u\xxxx”代表
import json
ret = json.dumps({'国籍':'美国'},ensure_ascii=False)
print(ret) ensure_ascii为true{"\u56fd\u7c4d": "\u7f8e\u56fd"}ensure_ascii=False{'国籍': '美国'}
print(json.loads(ret)){'国籍': '美国'}

pickle模块提供了四个功能：dumps、dump(序列化，存）、loads（反序列化，读）、load
（不仅可以序列化字典，列表...可以把python中任意的数据类型序列化）
pickle，用于python特有的类型 和 python的数据类型间进行转换
import pickle
dic = {'k1':'v1','k2':'v2','k3':'v3'}
str_dic = pickle.dumps(dic)
print(str_dic)  #一串二进制内容

dic2 = pickle.loads(str_dic)
print(dic2)    #字典

import time
struct_time  = time.localtime(1000000000)
print(struct_time)
f = open('pickle_file','wb')
pickle.dump(struct_time,f)
f.close()

f = open('pickle_file','rb')
struct_time2 = pickle.load(f)
print(struct_time2.tm_year)
下面给出一个爬虫的案列来说明一下
'''






